﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using GS1.Entidad;
using GS1.Utilitario;
using System.Configuration;
using System.Security.Cryptography.X509Certificates;
using System.Xml;
using Demo.wsUSUA;
using System.Xml.Serialization;
using System.Web;
using log4net;

namespace MantenimientoEtiquetasRFID
{
    public class ConexionREST
    {
        #region --- Variables y Constantes ----
        // URL Servicio REST (Local)

        private static string LLAVEHERMES = obtenerKey();

        private static string SERVICIO_REST_URL = ConfigurationManager.AppSettings[Constantes.URL_SERVICIO];
        private static string SERVICIO_REST_ACT = ConfigurationManager.AppSettings[Constantes.ACT_SERVICIO];
        private static string SERVICIO_REST_CER = ConfigurationManager.AppSettings[Constantes.CER_SERVICIO];
        private static string SERVICIO_RUTA_AUT = ConfigurationManager.AppSettings[Constantes.AUT_RUTA];
        private static string SERVICIO_REST_USR = ConfigurationManager.AppSettings[Constantes.USR_SERVICIO];
        private static string SERVICIO_REST_PAS = ConfigurationManager.AppSettings[Constantes.PAS_SERVICIO];

        private static readonly ILog log = LogManager.GetLogger(typeof(ConexionREST));

        // Tiempo de espera de respuesta del Servicio REST
        private static int SERVICO_REST_TIEMPO_ESPERA = ConfigurationManager.AppSettings[Constantes.TIEMPO_ESPERA].ToEntero();
        //35000;

        #endregion

        #region --- Metodos Propios ---
        /// <summary>
        /// Metodo: Que permite enviar una operacion al servicio REST
        /// </summary>
        /// <param name="operacion">Operacion a enviar al servicio</param>
        /// <returns>Trama obtenida como resultado</returns>
        public string ejecutarTrama(Login login)
        {
            string resultadoXML = string.Empty;

            string usuario = string.Empty;
            string clave = string.Empty;

            try
            {

                GestionarUsuarioPortType wsCliente = new GestionarUsuarioPortType();

                X509Certificate cert = X509Certificate.CreateFromCertFile(SERVICIO_REST_CER);
                wsCliente.ClientCertificates.Add(cert);

                var data = new Dictionary<string, string>();
                foreach (var row in File.ReadAllLines(SERVICIO_RUTA_AUT))
                data.Add(row.Split('=')[0], string.Join("=", row.Split('=').Skip(1).ToArray()));

                foreach (var urs in data)
                {
                    if (urs.Key.Equals(SERVICIO_REST_USR))
                    {
                        usuario = urs.Value;
                    }
                    if (urs.Key.Equals(SERVICIO_REST_PAS))
                    {
                        clave = urs.Value;
                    }
                }

                NetworkCredential nc = new NetworkCredential(usuario.desEncriptarDES(LLAVEHERMES).ToString(), clave.desEncriptarDES(LLAVEHERMES).ToString());
                wsCliente.Credentials = nc;

                RequestMetadaType md = new RequestMetadaType();

                md.user = login.usuarioUsua;
                md.remoteHost = login.codDisp;

                UsuarioConexionType usuarioConexion = new UsuarioConexionType();
                usuarioConexion.codigoUsuario = login.usuarioUsua;
                usuarioConexion.claveUsuario = login.claveUsua;
                usuarioConexion.codigoAplicacion = login.codApli;
                usuarioConexion.tipoDispositivo = login.tipoDisp;
                usuarioConexion.codigoDispositivo = login.codDisp;

                wsCliente.requestMetada = md;

                wsCliente.conectarAplicacion(ref usuarioConexion);

                log.Info("Usuario logueado:"+usuarioConexion.apellidosNombresEmpleado);

                resultadoXML = null;
        
            }
            catch (System.Web.Services.Protocols.SoapException e)
            {
                XmlDocument xmlDoc = new XmlDocument();

                string faultXML = e.Detail.InnerXml;

                xmlDoc.LoadXml(faultXML);

                XmlNodeList parentNode = xmlDoc.GetElementsByTagName("ns3:fault");

               foreach (XmlNode childrenNode in parentNode)
                {

                    XmlNodeList countNode = childrenNode.ChildNodes;

                    XmlNode codigo = countNode[0];
                    XmlNode descripcion = countNode[1];
                    if (codigo.InnerText.Equals("SRV_T_98_1_F04") || codigo.InnerText.Equals("SRV_T_98_1_F05") || codigo.InnerText.Equals("SRV_T_98_1_F06"))
                    {                    
                        resultadoXML = descripcion.InnerText;
                    }
                    else
                    {
                        resultadoXML = "Error de conexión, contactar con Helpdesk.";
                    }
                    log.Error("Error de web service:" + descripcion.InnerText);
                    

                }
                return resultadoXML;

             }
            return resultadoXML;
        }
        #endregion


        #region --- Metodos para obtener llave --
        private static string obtenerKey()
        {
            var dkey = new Dictionary<string, string>();
            foreach (var row in File.ReadAllLines(ConfigurationManager.AppSettings[Constantes.KEY_RUTA]))
                dkey.Add(row.Split('=')[0], string.Join("=", row.Split('=').Skip(1) .ToArray()));
            
            foreach (var item in dkey)
            {
                if(item.Key.Equals(ConfigurationManager.AppSettings[Constantes.KEY_SERVICIO]))
                {
                     LLAVEHERMES = item.Value;

                }  
            }

            return LLAVEHERMES;

        }
        #endregion

    }
}
